Руководства/Скрипты в ДС
В этой статье все будут писать все что знают о конфигурации ДС, как менять параметры мобов, персонажей, оружия и т.д. Статья будет постепенно расти и пополняться полезной информацией. Если кто знает и хочет, пусть сделает удобное оформление. Эта статья не для тех, кто все это уже знает и прошу не флудить в коментах типа "Блин а нафиг все это я уже знаю как все это делается", "ты нуб там еще много вещей которые ты не написал", "бесполезна удаляйте эту статью", она для тех, кто не в курсе всего этого! Постараюсь все объяснить на простейшем языке, чтобы даже ребенок смог колдовать над игрой и сделать ее сложнее или легче. Начало В основном что нам надо будет все в папке: D:\Steam\SteamApps\common\dont_starve\data\scripts\prefabs , а на пиратке просто надо зайти в папку с игрой\data\scripts\prefabs , первым делом открываем любой из файлов с помощью блокнота/ворда(Notepad/Word), теперь все файлы можно беспрепятственно открывать с помощью блокнота/ворда. Рекомендую Notepad++ с подсветкой синтаксиса. Перейдем к главному Теперь напишу собственно о том как, что и где менять. Приведу примеры а остальное потребует только начального уровня знание английского и знание цифр что-ли? Пример как поменять урон оружию: 'находим оружие/инструмент, к примеру топор, находим и заходим в папку axe.lua или у кого-то просто axe и находим строку -inst.components.weapon:SetDamage(TUNING.AXE_DAMAGE) это собственно и есть урон, для того чтобы поменять его вписываем туда "*" и цифру на которую хотим умножить урон - inst.components.weapon:SetDamage(TUNING.AXE_DAMAGE*2) это сделает урон в 2 раза больше, а если вписать туда цифру меньше 1, то это понизит урон топора inst.components.weapon:SetDamage(TUNING.AXE_DAMAGE*0.5) то же самое и для копья, шипа щупальца, кирки, молота и вообще можно даже зонтику урон сделать как у копья... Все что надо сделать это только найти название оружия/инструмента папке с игрой\data\scripts\prefabs и проделать вышеуказаное действие. 'Посмотрим на другие строки: 'строка inst:AddComponent("tool") inst.components.tool:SetAction(ACTIONS.CHOP) мы видим там CHOP - это по английски рубить, если написать под этими двумя строками еще одну эдентичную второй, только вместо CHOP напишем MINE(долбить, добывать) то есть у нас получится inst:AddComponent("tool") inst.components.tool:SetAction(ACTIONS.CHOP) inst.components.tool:SetAction(ACTIONS.MINE) то топор будет добывать и рубить(читерство?). 'Еще одна другая строка: 'пониже есть строчки inst:AddComponent("finiteuses") inst.components.finiteuses:SetMaxUses(TUNING.AXE_USES) inst.components.finiteuses:SetUses(TUNING.AXE_USES) inst.components.finiteuses:SetOnFinished( onfinished) inst.components.finiteuses:SetConsumption(ACTIONS.CHOP, 1) это прочность, 2 и 3 строки отвечают за то чтобы у предмета было 100% прочности и впринципе мы можем их не трогать если хотим сделать чтоб топор дольше ломался, самая главная строчка это 5, она отвечает за поломку топора за один удар, в нашем случае 1, если поменять 1 на 0.1 то за 10 удар топором только он испортится на 1%, осталась 4 строчка только я не знаю зачем она, но есть предплолжения что это отвечает за то чтоб у тебя отобрался топор после достижения 0%. Вот наверное все о инструментах...но может что нибудь и добавлю еще...потом... 'Как менять параметры персонажам: чтобы изменить параметры любого из персонажей надо сперва найти его имя, это не сложно все они начинаются на W значит все они в конце всех файлов, вот вам всегда сложно(не всем конечно) что у Виллоу мало рассудка и вы хотите повысить ей рассудок. Для этого заходим в Willow.lua (Уже Player_common) или же просто Willow(у кого как) находим строку inst.components.sanity:SetMax(TUNING.WILLOW_SANITY) и по знакомому нам методу добавляем туда звездочку и цифру inst.components.sanity:SetMax(TUNING.WILLOW_SANITY*1.2) это немножко повысит ей рассудок, кстати SANITY - это рассудок. Или же вы хотите построить мясное чучело в 1 зиму, но также хотите чтобы борода грела его зимой и не приходилось надевать шапку, для этого заходим в Wilson/Wilson.lua и находим там --tune the beard economy... local beard_days = {3, 5, 9} local beard_bits = {1, 3, 9} 2 строка отвечает за дни, а 3 за количество получаемых клочков бороды за бритье, думаю пример приводить бессмысленно так как тут все понятно и просто - на верхней строке сказано что на 3 день щетина будет, на 5 борода а на 9 бородище, а на нижней что за бритье щетины 1 клочок дадут, за бороду 3 а за бородище 9 ( У меня уже это изменено у вас должно быть иначе) Для интереса можно посмотреть также файл Вэса Wes/Wes.lua , открыв его мы видим local fn = function(inst) inst.components.health:SetMaxHealth(TUNING.WILSON_HEALTH * .75 ) inst.components.hunger:SetMax(TUNING.WILSON_HUNGER * .75 ) inst.components.combat.damagemultiplier = .75 inst.components.hunger:SetRate(TUNING.WILSON_HUNGER_RATE*1.25) inst.components.sanity:SetMax(TUNING.WILSON_SANITY*.75) inst.components.inventory:GuaranteeItems(start_inv) мы видим что Вэс не имеет собственное хп, рассудок, голод а все это взято с Вилсона, тогда как у других персонажей там написано собственное имя. Остальное о персонажах вы можете посмотреть сами, не маленькие думаю сами разберетесь. О топливе: если мы войдем в файл любого горючего предмета скажем бревна(log)(может не бревно а полено или чтото еще, у меня английская версия я не в курсе), то мы увидем там inst:AddComponent("fuel") inst.components.fuel.fuelvalue = TUNING.MED_FUEL MED - MEDIUM(средний), FUEL - горючее, что значит средней горуючести, можно поставить там inst:AddComponent("fuel") inst.components.fuel.fuelvalue = TUNING.LARGE_FUEL LARGE - большой , тогда бревно будет давать самый большой огонь от которого Виллоу будет балдеть, а вы без проблем переживать долгие зимние ночи без добавления еще чегонибудь в костер. А если вам не хватает мест в рюкзаке: находим Backpack/Backpack.lua открываем его и сворачиваем и находим еще один файл Krampus_Sack, открываем и находим там строки local slotpos = {} for y = 0, 6 do table.insert(slotpos, Vector3(-162, -y*75 + 240 ,0)) table.insert(slotpos, Vector3(-162 +75, -y*75 + 240 ,0)) end вот это будет отвечать за ячейки, далее находим подобные строчки в Backpack/Backpack.lua и заменяем вышеприведенные, и вуаля, у вас рюкзак с 14 ячейкми. Меняем лут: это можно сделать так заходим в файл любого животного(которому собственно и будем менять лут)(кто не знает лут это дроп, добыча, то что выпадает из него если его забить в мясо(попонятнее объяснить не могу)), выбираем к примеру кроликов Rabbit/Rabbit.lua , там ищем строки inst.components.lootdropper:SetLoot({"smallmeat"}) smallmeat - маленькое мясо, можно сделать чтобы из кроликов выпадало бревно, для этого дописываем inst.components.lootdropper:SetLoot({"smallmeat"}, {"log"}) теперь из него будет выпадать бревно, а на самом деле можно заставить любое животное дропать любую вещь в любых количествах, ах да количество обозначается повторным написанием слова, скажем если надо чтобы выпало 2 бревна то пишем inst.components.lootdropper:SetLoot({"smallmeat"}, {"log"}, {"log"}) можно даже 3 или 4 и так до бесконечности(или пока вам не надоест) стакообразные(стэки, стаки, количество вещей в одной стопке(кому как удобно, но знайте это называют стаком)): предположим вам надоело таскать мало бревен, ведь скажем надо пойти кудато туда и построить 2 базу или склад неподалеку от базы и вам переносить много вещей, экономить место в инвентаре. Тогда заходим в файл предмета стак которого мы хотим увеличить, к примеру пепел(ash)(первое что попало под руку), там будет строчка inst:AddComponent("stackable") inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM пепел складывается в 40 штук, это самый большой стак в игре если вы не знаете, заметьте что тут написанно size smallitem, small это маленький а стак самый большой, SMALLITEM - маленький предмет, а маленькие предметы можно складывать в много, а большие соответственно в мало. Есть стаки в 40, 20, 10 и те которые не складываются TUNING.STACK_SIZE_SMALLITEM это 40 TUNING.STACK_SIZE_LARGEITEM это 20 и 10 насколько я понял ну тут собственно менять нечего а вот в boards(доски) и меняем там inst:AddComponent("stackable") inst.components.stackable.maxsize = TUNING.STACK_SIZE_LARGEITEM на inst:AddComponent("stackable") inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM !ВНИМАНИЕ! Открою вам секрет - так можно менять не только boards а также другие вещи! Меняем рецепты: Для этого нужно зайти в папку скриптов,то есть в Dont Starve\data\scripts и найти там файл recipes.lua далее ищем категорию,в которой мы будем менять рецепты,например: TOOLS Там ищем строку рецепта предмета,который нужно изменить,например: Recipe("axe", {Ingredient("twigs", 1),Ingredient("flint", 1)}, RECIPETABS.TOOLS, TECH.NONE) thumb|400px|Изменение рецепта с 12 лепестков до 6. Где axe-это название самого предмета,Ingredient-ингредиенты для создания вещи и их кол-во,RECIPETABS-категория вещи,и TECH-уровень науки/магии Можно выставлять в ингредиенты почти любые вещи,не более 3-4,любое количество оных,и уровень науки/магии для создания вещи Примечания от автора: 1) Перед каждым изменением желательно сделать бекап файла, войти и проверить, если запустилась то все нормально, а если все плохо то игра вылетит. 2) Не делайте урон копья +100500, а то будет не интересно играть. 3) не всегда название предмета совпадет с названием в скриптах. 4) не судите статью строго, я не мастер в статьяписательном ремесле. 5) не удаляйте статью =). 6) надеюсь люди знающие толк в этом деле помогут дополнять статью или исправлять. 7) если кто-то возьмется помочь, то пожалуйста прочитай остальное, чтобы не было написанно об одном и том же дважды. 8) если какой-то вандал испортит статью, то знай, у меня есть ее копия! А теперь немного практики: Добавим мэрму способность кушать рыбу, лягушачьи лапки и возможно дружба (хотяб как у свина) spoiler=merm.lualocal assets = { Asset("ANIM", "anim/merm_build.zip"), Asset("ANIM", "anim/ds_pig_basic.zip"), Asset("ANIM", "anim/ds_pig_actions.zip"), Asset("ANIM", "anim/ds_pig_attacks.zip"), Asset("SOUND", "sound/merm.fsb"), } local prefabs = { "fish", "froglegs", "mermhead", } local loot = { "fish", "froglegs", "mermhead", } local MAX_TARGET_SHARES = 5 local SHARE_TARGET_DIST = 30 --local function ontalk(inst, script) -- inst.SoundEmitter:PlaySound("dontstarve/creatures/bunnyman/idle_med") --inst.SoundEmitter:PlaySound("dontstarve/pig/grunt") --end local function CalcSanityAura(inst, observer) if inst.beardlord then return -TUNING.SANITYAURA_MED end if inst.components.follower and inst.components.follower.leader observer then return TUNING.SANITYAURA_SMALL end return 0 end local function ShouldAcceptItem(inst, item) if item.components.equippable and item.components.equippable.equipslot EQUIPSLOTS.HEAD then return true end if item.components.edible then if (item.prefab "fish" or item.prefab "fish_cooked" or item.prefab "froglegs" or item.prefab "froglegs_cooked") and inst.components.follower.leader and inst.components.follower:GetLoyaltyPercent() > 0.9 then return false end return true end end local function OnGetItemFromPlayer(inst, giver, item) --I eat food if item.components.edible then if (item.prefab "fish" or item.prefab "fish_cooked" or item.prefab "froglegs" or item.prefab "froglegs_cooked") then if inst.components.combat.target and inst.components.combat.target giver then inst.components.combat:SetTarget(nil) elseif giver.components.leader then inst.SoundEmitter:PlaySound("dontstarve/common/makeFriend") giver.components.leader:AddFollower(inst) inst.components.follower:AddLoyaltyTime(TUNING.RABBIT_CARROT_LOYALTY) end end if inst.components.sleeper:IsAsleep() then inst.components.sleeper:WakeUp() end end local function ShouldSleep(inst) return GetClock():IsDay() and not (inst.components.combat and inst.components.combat.target) and not (inst.components.homeseeker and inst.components.homeseeker:HasHome() ) and not (inst.components.burnable and inst.components.burnable:IsBurning() ) and not (inst.components.freezable and inst.components.freezable:IsFrozen() ) end local function ShouldWake(inst) return not GetClock():IsDay() or (inst.components.combat and inst.components.combat.target) or (inst.components.homeseeker and inst.components.homeseeker:HasHome() ) or (inst.components.burnable and inst.components.burnable:IsBurning() ) or (inst.components.freezable and inst.components.freezable:IsFrozen() ) end --I wear hats if item.components.equippable and item.components.equippable.equipslot EQUIPSLOTS.HEAD then local current = inst.components.inventory:GetEquippedItem(EQUIPSLOTS.HEAD) if current then inst.components.inventory:DropItem(current) end inst.components.inventory:Equip(item) inst.AnimState:Show("hat") end end local function OnRefuseItem(inst, item) inst.sg:GoToState("refuse") if inst.components.sleeper:IsAsleep() then inst.components.sleeper:WakeUp() end end local function OnEat(inst, food) if food.components.edible and food.components.edible.foodtype "MEAT" and inst.components.werebeast and not inst.components.werebeast:IsInWereState() then if food.components.edible:GetHealth() < 0 then inst.components.werebeast:TriggerDelta(1) end end end local function NormalKeepTargetFn(inst, target) return inst.components.combat:CanTarget(target) and not (target.sg and target.sg:HasStateTag("hiding")) end local function giveupstring(combatcmp, target) return STRINGS.MERM_GIVEUPmath.random(#STRINGS.MERM_GIVEUP) end local function battlecry(combatcmp, target) return STRINGS.MERM_BATTLECRYmath.random(#STRINGS.MERM_BATTLECRY) end local function RetargetFn(inst) local defenseTarget = inst local home = inst.components.homeseeker and inst.components.homeseeker.home if home and inst:GetDistanceSqToInst(home) < TUNING.MERM_DEFEND_DIST*TUNING.MERM_DEFEND_DIST then defenseTarget = home end local invader = FindEntity(defenseTarget or inst, TUNING.MERM_TARGET_DIST, function(guy) return guy:HasTag("character") and not guy:HasTag("merm") end) return invader end local function KeepTargetFn(inst, target) local home = inst.components.homeseeker and inst.components.homeseeker.home if home then return home:GetDistanceSqToInst(target) < TUNING.MERM_DEFEND_DIST*TUNING.MERM_DEFEND_DIST and home:GetDistanceSqToInst(inst) < TUNING.MERM_DEFEND_DIST*TUNING.MERM_DEFEND_DIST end return inst.components.combat:CanTarget(target) end local function OnAttacked(inst, data) local attacker = data and data.attacker if attacker and inst.components.combat:CanTarget(attacker) then inst.components.combat:SetTarget(attacker) local targetshares = MAX_TARGET_SHARES if inst.components.homeseeker and inst.components.homeseeker.home then local home = inst.components.homeseeker.home if home and home.components.childspawner and inst:GetDistanceSqToInst(home) <= SHARE_TARGET_DIST*SHARE_TARGET_DIST then targetshares = targetshares - home.components.childspawner.childreninside home.components.childspawner:ReleaseAllChildren(attacker) end inst.components.combat:ShareTarget(attacker, SHARE_TARGET_DIST, function(dude) return dude.components.homeseeker and dude.components.homeseeker.home and dude.components.homeseeker.home home end, targetshares) end end end --local function CheckTransformState(inst) -- if not inst.components.health:IsDead() then -- if GetPlayer().components.sanity:GetPercent() > TUNING.BEARDLING_SANITY then -- SetNormalRabbit(inst) -- else -- SetBeardlord(inst) -- end -- end --end --local function OnWake(inst) -- CheckTransformState(inst) -- inst.checktask = inst:DoPeriodicTask(10, CheckTransformState) --end --local function OnSleep(inst) -- if inst.checktask then -- inst.checktask:Cancel() -- inst.checktask = nil -- end --end local function fn() local inst = CreateEntity() local trans = inst.entity:AddTransform() local anim = inst.entity:AddAnimState() local sound = inst.entity:AddSoundEmitter() local shadow = inst.entity:AddDynamicShadow() shadow:SetSize( 1.5, .75 ) inst.Transform:SetFourFaced() local s = 1.25 inst.Transform:SetScale(s,s,s) inst.entity:AddLightWatcher() MakeCharacterPhysics(inst, 50, .5) anim:SetBank("pigman") anim:SetBuild("merm_build") anim:PlayAnimation("idle_loop") inst:AddComponent("locomotor") inst.components.locomotor.runspeed = TUNING.MERM_RUN_SPEED inst.components.locomotor.walkspeed = TUNING.MERM_WALK_SPEED inst:SetStateGraph("SGmerm") anim:Hide("hat") inst:AddTag("character") inst:AddTag("merm") inst:AddTag("wet") inst:AddTag("scarytoprey") -- inst.CheckTransformState = CheckTransformState --used for purpleamulet ------------------------------------------ inst:AddComponent("eater") inst.components.eater:SetOmnivore() inst.components.eater:SetCanEatHorrible() inst.components.eater.strongstomach = true -- can eat monster meat! inst.components.eater:SetOnEatFn(OnEat) ------------------------------------------ inst:AddComponent("combat") inst.components.combat.hiteffectsymbol = "pig_torso" inst.components.combat:SetAttackPeriod(TUNING.MERM_ATTACK_PERIOD) inst.components.combat:SetRetargetFunction(1, RetargetFn) inst.components.combat:SetKeepTargetFunction(KeepTargetFn) inst.components.combat.GetBattleCryString = battlecry inst.components.combat.GetGiveUpString = giveupstring MakeMediumBurnableCharacter(inst, "manrabbit_torso") inst:AddComponent("named") inst.components.named.possiblenames = STRINGS.PIGNAMES inst.components.named:PickNewName() ------------------------------------------ inst:AddComponent("follower") inst.components.follower.maxfollowtime = TUNING.PIG_LOYALTY_MAXTIME ------------------------------------------ inst:AddComponent("health") inst.components.health:SetMaxHealth(TUNING.MERM_HEALTH) inst.components.combat:SetDefaultDamage(TUNING.MERM_DAMAGE) inst.components.combat:SetAttackPeriod(TUNING.MERM_ATTACK_PERIOD) ------------------------------------------ inst:AddComponent("inventory") ------------------------------------------ inst:AddComponent("lootdropper") inst.components.lootdropper:SetLoot(loot) ------------------------------------------ inst:AddComponent("knownlocations") -- inst:AddComponent("talker") -- inst.components.talker.ontalk = ontalk -- inst.components.talker.fontsize = 24 -- inst.components.talker.font = TALKINGFONT -- inst.components.talker.offset = Vector3(0,-500,0) ------------------------------------------ inst:AddComponent("trader") inst.components.trader:SetAcceptTest(ShouldAcceptItem) inst.components.trader.onaccept = OnGetItemFromPlayer inst.components.trader.onrefuse = OnRefuseItem ------------------------------------------ inst:AddComponent("sanityaura") inst.components.sanityaura.aurafn = CalcSanityAura ------------------------------------------ inst:AddComponent("sleeper") ------------------------------------------ MakeMediumFreezableCharacter(inst, "pig_torso") ------------------------------------------ inst:AddComponent("inspectable") inst.components.inspectable.getstatus = function(inst) if inst.components.follower.leader ~= nil then return "FOLLOWER" end end ------------------------------------------ inst:ListenForEvent("attacked", OnAttacked) inst:ListenForEvent("newcombattarget", RetargetFn) --inst.components.werebeast:SetOnWereFn(SetBeardlord) --inst.components.werebeast:SetOnNormaleFn(SetNormalRabbit) -- CheckTransformState(inst) -- inst.OnEntityWake = OnWake -- inst.OnEntitySleep = OnSleep inst.components.sleeper:SetResistance(2) inst.components.sleeper.nocturnal = true inst.components.combat:SetKeepTargetFunction(NormalKeepTargetFn) inst.components.trader:Enable() --inst.Label:Enable(true) --inst.components.talker:StopIgnoringAll() local brain = require "brains/mermbrain" inst:SetBrain(brain) return inst end return Prefab("forest/animals/merm", fn, assets, prefabs)/spoiler Не могу ему докрутить чтоб после приручения не бил меня нужен совет (возможно надо править mermbrain.lua) Категория:Руководства Категория:Моддинг